package com.company.calendar.controller;

import com.company.calendar.dto.CalendarDayDTO;
import com.company.calendar.dto.CalendarQueryDTO;
import com.company.calendar.service.CalendarService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.time.LocalDate;
import java.util.List;

/**
 * 日历控制器
 * 
 * @author System
 * @since 1.0.0
 */
@RestController
@RequestMapping("/calendar")
@RequiredArgsConstructor
@Slf4j
public class CalendarController {
    
    private final CalendarService calendarService;
    
    /**
     * 获取日历数据
     * 
     * @param queryDTO 查询条件
     * @return 日历数据
     */
    @PostMapping("/data")
    public ResponseEntity<List<CalendarDayDTO>> getCalendarData(@Valid @RequestBody CalendarQueryDTO queryDTO) {
        log.info("获取日历数据: 公司ID={}, 日期范围={} 到 {}", 
                queryDTO.getCompanyId(), queryDTO.getStartDate(), queryDTO.getEndDate());
        List<CalendarDayDTO> calendarData = calendarService.getCalendarData(queryDTO);
        return ResponseEntity.ok(calendarData);
    }
    
    /**
     * 检查指定日期是否为工作日
     * 
     * @param companyId 公司ID
     * @param date 日期
     * @return 是否为工作日
     */
    @GetMapping("/workday/{companyId}")
    public ResponseEntity<Boolean> isWorkday(@PathVariable Long companyId,
                                           @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
        log.info("检查日期是否为工作日: 公司ID={}, 日期={}", companyId, date);
        boolean isWorkday = calendarService.isWorkday(companyId, date);
        return ResponseEntity.ok(isWorkday);
    }
    
    /**
     * 获取指定日期的详细信息
     * 
     * @param companyId 公司ID
     * @param date 日期
     * @return 日期详细信息
     */
    @GetMapping("/day/{companyId}")
    public ResponseEntity<CalendarDayDTO> getDayInfo(@PathVariable Long companyId,
                                                    @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
        log.info("获取日期详细信息: 公司ID={}, 日期={}", companyId, date);
        CalendarDayDTO dayInfo = calendarService.getDayInfo(companyId, date);
        return dayInfo != null ? ResponseEntity.ok(dayInfo) : ResponseEntity.notFound().build();
    }
    
    /**
     * 获取指定月份的日历数据
     * 
     * @param companyId 公司ID
     * @param year 年份
     * @param month 月份
     * @return 日历数据
     */
    @GetMapping("/month/{companyId}")
    public ResponseEntity<List<CalendarDayDTO>> getMonthCalendar(@PathVariable Long companyId,
                                                                @RequestParam Integer year,
                                                                @RequestParam Integer month) {
        log.info("获取月份日历数据: 公司ID={}, 年份={}, 月份={}", companyId, year, month);
        
        LocalDate startDate = LocalDate.of(year, month, 1);
        LocalDate endDate = startDate.withDayOfMonth(startDate.lengthOfMonth());
        
        CalendarQueryDTO queryDTO = new CalendarQueryDTO();
        queryDTO.setCompanyId(companyId);
        queryDTO.setStartDate(startDate);
        queryDTO.setEndDate(endDate);
        
        List<CalendarDayDTO> calendarData = calendarService.getCalendarData(queryDTO);
        return ResponseEntity.ok(calendarData);
    }
    
    /**
     * 获取指定年份的日历数据
     * 
     * @param companyId 公司ID
     * @param year 年份
     * @return 日历数据
     */
    @GetMapping("/year/{companyId}")
    public ResponseEntity<List<CalendarDayDTO>> getYearCalendar(@PathVariable Long companyId,
                                                               @RequestParam Integer year) {
        log.info("获取年份日历数据: 公司ID={}, 年份={}", companyId, year);
        
        LocalDate startDate = LocalDate.of(year, 1, 1);
        LocalDate endDate = LocalDate.of(year, 12, 31);
        
        CalendarQueryDTO queryDTO = new CalendarQueryDTO();
        queryDTO.setCompanyId(companyId);
        queryDTO.setStartDate(startDate);
        queryDTO.setEndDate(endDate);
        
        List<CalendarDayDTO> calendarData = calendarService.getCalendarData(queryDTO);
        return ResponseEntity.ok(calendarData);
    }
}


